//
// Created by Administrator on 2024/3/25.
//
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
#define endl '\n'
const size_t maxn = 1000 + 50;
ll dp[maxn][maxn];//dp[i][j]是累乘Mi到Mj(一共j-i+1个)所需要的最小次数
ll a[maxn + 1];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    cin >> n;//读入矩阵个数

    for (int i = 0; i < n; i++) {//读入矩阵的各个维度
        cin >> a[i] >> a[i + 1];
    }
    //初始化
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            if (i == j) {
                dp[i][j] = 0;//相等的时候为0 长度为1的矩阵列表
            } else if (i + 1 == j) {
                dp[i][j] = a[i] * a[j] * a[j + 1];//相临的时候为a[i] * a[j] * a[j + 1],长度为2的矩阵列表
            } else {
                dp[i][j] = INT_MAX / 8;//其他先初始化为INF
            }
        }
    for (int l = 3; l <= n; ++l) {//从短到长枚举是关键
        for (int i = 0; i < n; i++) {
            int j = i + l - 1;
            for (int k = i; k + 1 <= j; k++) {
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + a[i] * a[k + 1] * a[j + 1]);//动态规划的状态转移方程
            }

        }
    }

    cout << dp[0][n - 1] << endl;

    return 0;
}